
PTime=[11 3.5 2 0.5 8 1 0.5 24 1.5;11 3.5 2 0.4 8 1 0.5 24 1.5;12 2 1.5 0.5 8 0.5 0.5 24 1.5;11 1.5 1 0.3 8 0.3 0.5 24 1.5;11 1.5 2 0.3 8 0.3 0.5 24 1.5;11 2.5 2 0.4 8 0.5 0.5 24 1.5];
Ddate=[72 72 72 70 70 72]*2;
[PNumber,MNumber]=size(PTime);
Scheme = zeros(9,6);
%%初始化完成时间矩阵
Mspan=zeros(PNumber,MNumber); %用矩阵存储每个工件每道工序的完成时间，初始赋值为零，公式中的C(j,Nk)
BginTime=zeros(PNumber,MNumber);
D=zeros(PNumber,MNumber);

for k=1:MNumber
  switch k
 %%%%%%%%%%%%%%第一道工序的完成时间
      case 1
          for i=1:PNumber
                if i==1     %该工序之前没有工序，单独讨论
                j=Scheme(k,1);
                BginTime(j,k)=0;
                else
                j=Scheme(k,i); %当前工件，Scheme是染色体生产的调度工序
                Previous_j=Scheme(k,i-1); %该工序中的前一个工件
                BginTime(j,k)=Mspan(Previous_j,k);
                end
                Mspan(j,k)=BginTime(j,k)+PTime(j,k);
                D(j,k)=fix(Mspan(j,k)/24);
                if Mspan(j,k)>(24*D(j,k)+10) %Hw=10
                  Mspan(j,k)=Mspan(j,k)+14; %HN=14 ???????
                end
          end

%%%%%%%%%%%%%%%%%%%%第4道工序的完成时间 %浇筑阶段
      case 4 
          for i=1:PNumber
                if i==1     
                 j=Scheme(k,1);
                 BginTime(j,k)=Mspan(j,k-1);
                else
                 j=Scheme(k,i); %当前工件，Scheme是染色体生产的调度工序
                 Previous_j=Scheme(k,i-1); %该工序中的前一个工件
                   if Mspan(Previous_j,k)>Mspan(j,k-1)
                      BginTime(j,k)=Mspan(Previous_j,k);
                   else
                       BginTime(j,k)=Mspan(j,k-1);
                   end
                end
            Mspan(j,k)=BginTime(j,k)+PTime(j,k);% 此条件判断开始时间
            D(j,k)=fix(Mspan(j,k)/24);
                 if Mspan(j,k)>(24*D+10+4) %Hw=10
                    Mspan(j,k)=24*D(j,k)+24+PTime(j,k); 
                    BginTime(j,k)=24*D(j,k)+24; %浇筑阶段工序不可中断，第二天才开始工作，开始时间进行修正
                  end
          end
    
    
    %%%%%%%%%%%%%%%%%%%%第5道工序的完成时间，固化阶段，并行工序
      case 5 
          for i=1:PNumber  %固化阶段，并行工序
               j=Scheme(k,i); 
               BginTime(j,k)=Mspan(j,k-1);  
               Mspan(j,k)=BginTime(j,k)+PTime(j,k);
               D(j,k)=fix(Mspan(j,k)/24);
                   if Mspan(j,k)>(24*D(j,k)+10)
                      if Mspan(j,k)<24*(D(j,k)+1)
                       Mspan(j,k)=24*D(j,k)+24;
                      end
                   end
          end
    
    %%%%%%%%%%%%%%%%%%%%%%% %%第8道工序的完成时间,存储阶段，并行工序，不需要劳动资源
      case 8 
          for i=1:PNumber
               j=Scheme(k,i); 
               BginTime(j,k)=Mspan(j,k-1);  
               Mspan(j,k)=BginTime(j,k)+PTime(j,k);
          end
    %%%%%%%%%%%%%%%%%%%%%%% %%第9道工序的完成时间,运输阶段
      case 9 
         for i=1:PNumber
               j=Scheme(k,i); 
               BginTime(j,k)=Mspan(j,k-1);  
               Mspan(j,k)=BginTime(j,k)+PTime(j,k);
               I=fix(Mspan(j,k-1)/24);%前8道工序完成时间的整天数
               Temp=mod(Mspan(j,k-1),24);%前8道工序完成时间减去整天数后剩余的小时（不够一天）
                    if Temp<22
                      Mspan(j,k)=I*24+22+PTime(j,k);
                      BginTime(j,k)=I*24+22;%十点之后才运输，开始时间进行修正
                    else
                      Mspan(j,k)=Mspan(j,k-1)+PTime(j,k); 
                    end
          end
    
    %%%%%%%%%%%%%%%%%%%%第2,3,6,7道工序的完成时间
      otherwise
          for i=1:PNumber
                if i==1     
                 j=Scheme(k,1);
                 BginTime(j,k)=Mspan(j,k-1);
                else
                 j=Scheme(k,i); %当前工件，Scheme是染色体生产的调度工序
                 Previous_j=Scheme(k,i-1); %该工序中的前一个工件
                       if Mspan(Previous_j,k)>Mspan(j,k-1)
                          BginTime(j,k)=Mspan(Previous_j,k);
                       else
                           BginTime(j,k)=Mspan(j,k-1);
                       end
                end
            Mspan(j,k)=BginTime(j,k)+PTime(j,k);
            D=fix(Mspan(j,k)/24);
                if Mspan(j,k)>(24*D+10) %Hw=10
                  Mspan(j,k)=Mspan(j,k)+14; %HN=14
                end
         end
 
  end
end

%%%%%%%%%%%%%%%%%%%编写目标函数,即所有工件交付的总费用 TCost（延迟和提前）。
CMspan=Mspan(:,MNumber);%%%%提取最后一列，即每个工件最后一道工序的完成时间
my_TCost=0;

for j=1:PNumber
    temp1=CMspan(j,1)-Ddate(j);%%%延迟的时间
    temp2=Ddate(j)-CMspan(j,1);%%%提前的时间
    if temp1>=0
        my_Cost(j)=10*temp1;%%%延迟的费用，10系数
    elseif temp2>=0
          my_Cost(j)=2*temp2;  %%%提前的费用，2系数
    else
        my_Cost(j)=0;
    end
    my_TCost=my_TCost+ my_Cost(j);
end